package control;

import comunicacion.InterfazClienteServidor;
import java.util.logging.Level;
import java.util.logging.Logger;
import pantallas.*;
import estado.EstadoCliente;

public class ManejadorCrearPartida {

/************atributos*******************************************/
    private ManejadorPrincipal mp;
    private ManejadorMensajesSalida mms;
    private ManejadorMensajesEntrada mme;
    private PantallaCrearPartida pantallaCrearPartida;
    private EstadoCliente estadoCliente;
    private InterfazClienteServidor interfazClienteServidor;

    private boolean partidaCreada;
    
    private int cantJugadores;
    private int tipoEscenario;
    private String ip;
/****************************************************************/

/************metodos*********************************************/
    public ManejadorCrearPartida(ManejadorPrincipal mp, ManejadorMensajesEntrada mme, ManejadorMensajesSalida mms ) {
        this.mp = mp;                   //copia las referencias a variables locales, mme no lo copia ya que no la necesita en el futuro.
        this.mms = mms;
        this.mme = mme;
        estadoCliente = new EstadoCliente();
        estadoCliente.setCreandoPartida();
        this.mme.setManejadorCrearPartida(this); //le pasa su referencia al ManejadorMensajesEntrada.
        pantallaCrearPartida=new PantallaCrearPartida (this); //tiene un boton aceptar para crear la partida (una vez ingresado los datos y un boton cancelar para volver a la PantallaPrincipal.
    }

    public void generadorPartida () {
        tipoEscenario = pantallaCrearPartida.getTipoEscenario(); //copia los valores ingresados por el usuario de la PantallaCrearPartida.
        cantJugadores = pantallaCrearPartida.getCantJugadores();
        ip = pantallaCrearPartida.getIP();
        
        if(ipValido(ip)){
            interfazClienteServidor = new InterfazClienteServidor(ip, 8001, estadoCliente, mme, mms);
            try {
                Thread.sleep(100);            
                if(interfazClienteServidor.getConexionCreada())
                    mms.MsjCrearPartida (tipoEscenario, cantJugadores, ip); //le envia los datos de la partida a crear al ManejadorMensajesSalida.
                else{
                    Thread.sleep(5000);
                    if(interfazClienteServidor.getConexionCreada())
                        mms.MsjCrearPartida (tipoEscenario, cantJugadores, ip); //le envia los datos de la partida a crear al ManejadorMensajesSalida.
                    else{
                        System.out.println("El servidor no responde..");
                        new PantallaError("Al Crear la Partida. El servidor no responde");
                    }
                }
            }
            catch (InterruptedException ex) {
                Logger.getLogger(ManejadorCrearPartida.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        else{
            new PantallaError("Al Crear la Partida. Error en IP");
            System.out.println("Error en ip!!");
        }  
    }

    public boolean ipValido(String ip){
        return (ip.matches("^[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}$"))||(ip.matches("localhost"));
    }

    public void recibePartidaCreada (boolean partidaCreada) {
        this.partidaCreada = partidaCreada;
        if (partidaCreada){
            pantallaCrearPartida.ocultarPantalla();
            new PantallaPartidaCreada(this);
        }  //solo tiene el mensaje y un boton aceptar para volver a la pantallaPrincipal //chequeo el msjACK enviado por el servidor y contesto abriendo una pantalla segun si se creo o no la partida con exito.
        else new PantallaError("error al crear partida"); //solo tiene el mensaje y un boton aceptar para volver a la pantallaCrearPartida
    }

    public void mostrarPantallaPrincipal(){
        mp.mostrarPantallaPrincipal();
    }

/****************************************************************/
}
